home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 30
/
Amiga Format AFCD30 (Sep 1998, Issue 114).iso
/
-seriously_amiga-
/
workbench
/
reboot
/
reboot.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-18
|
29KB
|
1,049 lines
/*
**
** $VER: Reboot.c 1.10 (4.6.1998)
** Reboot 1.10
**
** main file
**
** (C) Copyright 1994-1998 by Roland 'Gizzy' Mainz
** All Rights Reserved
**
*/
/* We did not want any names before V36 */
#define INTUI_V36_NAMES_ONLY 1
/* amiga includes */
#include <exec/types.h>
#include <utility/utility.h>
#include <dos/dos.h>
#include <intuition/intuition.h>
#include <workbench/startup.h>
#include <workbench/icon.h>
#include <libraries/locale.h>
/* amiga prototypes */
#include <clib/exec_protos.h>
#include <clib/utility_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/icon_protos.h>
#include <clib/locale_protos.h>
/* amiga pragmas */
#include <pragmas/exec_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <pragmas/dos_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/icon_pragmas.h>
#include <pragmas/locale_pragmas.h>
#include <pragmas/alib_pragmas.h> /* tagcall stubs */
/* ansi includes */
#include <string.h>
/* version string */
#include "Reboot_rev.h"
/* locale */
#define CATCOMP_NUMBERS
#define CATCOMP_STRINGS
#include "Reboot_strings.h"
/* misc defines */
#ifndef NAME
#define NAME "Reboot"
#endif /* !NAME */
/* prototypes */
#ifdef _DCC
void chkabort( void );
long wbmain( struct WBStartup * );
#endif /* _DCC */
long main( long, STRPTR * );
static void DefaultSettings( void );
static void FreeInitProjectResult( void );
static void ReadENVPrefs( void );
static void ClearRDA( void );
static void ScanRDA( void );
static void ScanToolTypes( STRPTR * );
static void RunTool( void );
static BOOL OpenLibStuff( void );
static void CloseLibStuff( void );
static BOOL CreateBasicResources( void );
static void DeleteBasicResources( void );
void AttemptOpenLibrary( struct Library **, STRPTR, STRPTR, ULONG );
static void RunTool( void );
static void MyReboot( void );
static STRPTR SafeGetCatalogStr( struct Catalog *, LONG, STRPTR );
static STRPTR SafeGetLocaleStr( struct Locale *, LONG, STRPTR );
static struct DiskObject *GetToolDiskObject( STRPTR );
/* version_string */
STRPTR versionstring = VERSTAG;
long main_retval,
main_retval2;
static struct RDArgs *startuprda;
/* shared libraries */
extern struct Library *SysBase,
*DOSBase;
struct Library *UtilityBase,
*IntuitionBase,
*IconBase,
*LocaleBase;
/* locale support */
struct Locale *loc;
struct Catalog *ct;
/* templates for ReadArgs */
#define STARTUP_TEMPLATE "REBOOTDELAY/K/N,QUIET=NOREQ/S,OFF/S,NOGUI/S"
#define ENV_TEMPLATE STARTUP_TEMPLATE /* no /A switches */
static
struct
{
long *rebootdelay;
long *noreq;
long *off;
long *nogui;
} result;
static
struct
{
ULONG rebootdelay;
BOOL noreq;
BOOL off;
BOOL nogui;
} project;
#ifdef _DCC
/* disable CTRL_C break support (DICE CTRL_C abort function) */
void chkabort( void )
{
}
#endif /* _DCC */
/****** Reboot/Reboot ********************************************************
*
* NAME
* Reboot -- rebooting utility
*
* FORMAT
* Reboot [REBOOTDELAY <seconds>] [QUIET|NOREQ] [OFF] [NOGUI]
*
* TEMPLATE
* REBOOTDELAY/K/N,QUIET=NOREQ/S,OFF/S,NOGUI/S
*
* TOOLTYPES
* REBOOTDELAY/N
* QUIET/S
* NOREQ/S
* OFF/S
* NOGUI/S
*
* PURPOSE
* To reboot the computer.
*
* INTRODUCTION
* A simple tool to be used with Kickstart 2.x/3.x, written by
* Roland 'Gizzy' Mainz, freeware, all rights reserved.
* No guarantee of any kind is made that the programm described below
* in this document is 100% reliable. You use this material on your own
* risk.
*
* While playing with ENVOY 1.6, I need a program which allows to reboot
* another AMIGA through the network (by my own "RemoteNetShell") or
* after a given time.
* First I wrote a little script (using WAIT) and a C program calling
* exec.library/ColdReboot() to solve this problem.
* Switching to IAM's ENVOY 2.0 I replaced this script by this tool,
* adding some features (WB (including multiselect), SHELL ReadArgs,
* locale support and test mode).
*
* DESCRIPTION
* Reboot is used to reboot the whole computer like a "cold"
* system start.
*
* Unless you specify otherwise (through REBOOTDELAY option), reboot
* will wait 2 seconds before rebooting the system.
* This is used to let the system (and it's disk drives) settle.
* This delay time can't be less than 1 second, a REBOOTDELAY=0
* will also wait this minimum time.
*
* Whenever the QUIET (or NOREQ) switch is set, the verify requesters
* ("Are you sure#?" etc.) will be suppressed.
*
* If the OFF switch is set, the tool act like when a CTRL-C signal
* has been send to the tool.
*
* Variable support:
* The environment REBOOT variable (either LOCAL or GLOBAL) can be
* used for default settings. The parsing template for this
* variable is the same like the shell template (see above).
*
* Reboot supports workbench multiselect (e.g. project icons) !
*
* The NOGUI option disables the requester and makes a simple
* console query. Currently, the NOGUI option should not be used
* if launched from WB.
*
* If requesters have been disabled in a shell (using tools like DICE's
* "noreq" tool), the NOGUI option is on per default.
*
* BUGS
* - Shell variables longer than 255 are currently not supported.
*
* - Any errors during tooltype processing are ignored.
*
* - The usage of the NOGUI option is not recommned to be used from
* WB.
*
* - Does not work properly with my Apollo 2030 accerlator board.
* The system reboots, then hangs. Cause known,
* comments welcome.
*
* NOTES
* "Set Reboot OFF" (e.g. use of a local variable) is only valid if
* you start Reboot from this shell.
*
* HISTORY
* V1.1:
* - First release
*
* V1.2:
* - The "Abort reboot" requester couldn't be canceld 1 second before
* the given time.
* Fixed.
*
* - I did not read the autodocs exactly:
* The function BuildEasyRequest might return 0 or 1 at low mem time.
* Now Reboot simply fails with ERROR_NO_FREE_STORE for both 0 or 1.
* If 1 was returned, an enforcer hit would occur.
* Never happed, but
* fixed.
*
* - AttemptOpenLibrary could return (sometimes) random pointers.
* In fact, this never happened by me, but maybe ...
* Fixed.
*
* - While getting Reboot's environment variable, the "Abort reboot"
* requester might be canceled. Now we check this:
* Fixed.
*
* - Additional, there was some code cleanup which adds support for
* DICE INLINE calls.
*
* - The executable is now PURE and can be made resident.
*
* - The time between the program checks the "Abort reboot" requester
* has been decrased down to a half second.
*
* V1.3
* - Starting with V1.3 environment variables are supported.
* Things set in var "REBOOT" (local or global) will be parsed after
* built-in default settings and before any user-given arguments
* (shell args or project icons), which can overide those ENV
* settings given there.
*
* This feature may cause Enforcer hits (I think so, I've never seen
* one).
*
* V1.4
* - Starting with V1.4, ENV parsing should be safe.
* For Bug reports, I've included a Reboot.ld, which includes the
* debugging info used by Enforcer/FindHit.
*
* - Running CPU FASTROM causes sometimes problems: The system reboots,
* but then hang atfer a while... ???
*
* V1.5
* - Now I fully support SAS/C for all my projects (SMakefile
* included). A matching DMakefile is on the way.
*
* V1.6
* - Unused utility.library code has been removed
*
* V1.7
* - Recompiled with SAS/C 6.57
*
* - Minor code cleanup.
*
* - Moved contents of the #?.guide to this autodoc
*
* V1.8
* - Added français catalog file
* Thanks to Julien Wilk (wilkj@esiee.fr).
*
* - Added NOGUI option, e.g. localized console prompt :-)
*
* V1.9
* - Silly mistake: I forgot to update the version string in V1.8.
* (Now the version string shows correctly V1.9).
*
* - Recompiled with SAS/C 6.58 to get rid of some mc68060 problems.
*
* - Fixed the longstanding bug that project icons did only work if
* Reboot's full path was given in "Default Tool".
*
* V1.10
* - Added Croatia (hrvatski) catalog file.
* Thanks to Sinisa Lolic (vegi@usa.net).
*
* - If a (required) shared library cannot be opened,
* "Reboot" returns now ERROR_INVALID_RESIDENT_LIBRARY instead
* of ERROR_OBJECT_NOT_FOUND.
*
* - The NOGUI option is now on per default if requesters have been
* disabled in the current shell (e..g if (thisproc -> pr_WindowPtr)
* is -1L).
*
* - Added "SmallReboot" project for those people who said that
* "Reboot" is too big.
* The small sister of "Reboot" is only ~124 bytes small and still
* includes a version string...
*
*
* INSTALLATION
* After unpacking this archieve:
*
* Workbench:
* - Drop the 'Reboot' icon in your favorite drawer (like
* "SYS:Utilities/").
* See SHELL for copying the catalog files.
*
* Shell:
* - Unpack this archieve at "SYS:Utilities/"
* and add the following statements at your "S:user-startup" startup
* file:
*
* Assign Reboot: SYS:Utilities/Reboot
* path Reboot: ADD
* OR
* - Drop/Copy the 'Reboot' file in your favorite directory
* (like "Sys:Utilities").
* To copy the (german) catalog files, type
* Copy Catalogs/#? TO="LOCALE:Catalogs/" ALL QUIET CLONE
*
* SAS:
* - Type 'smake install' in shell
*
* SOURCE
* DICE users may use DMakefile (if included).
* GNU-C support will be done in one future version.
*
* All:
* If you like to include a new language (like Français or Nederlands
* etc.), send me a filled "Reboot_blank.ct" file named "Reboot_#?.ct"
* (#? for your language). As an example, see "Reboot_deutsch.ct".
* Note that I can currently only process "Reboot_#?.ct" files whose
* language is supported by AmigaOS 3.1 (e.g. a AmigaDOS Locale language
* driver exists).
*
* SAS/C:
* Use SMakefile to create the executable.
* Note that the français locale file cannot be build with SAS/C SMake
* because it does not support the 'ç' character.
*
* AUTHOR's REQUEST
* By releasing this program I do not place any obligations on you,
* feel free to share this program with your friends (and enemies).
*
* If you want to blame me, report any bugs, or wants a new version
* send your letter to:
* Roland Mainz
* Hohenstaufenstraße 8
* 52388 Nörvenich
* GERMANY
*
* Phone: (+49)(0)2426/901568
* Fax: (+49)(0)2426/901569
*
* EMAIL is also available:
* GISBURN@w-specht.rhein-ruhr.de
*
* If you want to send me attachments larger than 1MB (up to 5MB,
* more with my permission):
* Up to August 1998 I'm reachable using this email address, too:
* Reinhold.A.Mainz@KBV.DE
*
* | Please put your name and address in your mails !
* | German mailers should add their phone numbers.
* | See BUGS section above when submitting bug reports.
*
* Sorry, but I can only look once a week for mails.
* If you don't hear something from me within three weeks, please
* send your mail again (but watch about new releases) (problems with
* this email port are caused by reconfigurations, hackers, network
* problems etc.).
*
* The entire "Reboot" package may be noncommercially
* redistributed, provided that the package is always distributed
* in it's complete form (including it's documentation). A small copy
* fee for media costs is okay but any kind of commercial distribution
* is strictly forbidden! Comments and suggestions how to improve
* this program are generally appreciated!
*
* Thanks to Matt Dillon for his DICE, and Olaf 'Olsen'
* Barthel for his help, ideas and some text clips from his
* documentations.
*
* SEE ALSO
* exec.library/ColdReboot
*
******************************************************************************
*
*/
/* DICE workbench entry */
#ifdef _DCC
long wbmain( struct WBStartup *wbstartup )
{
/* Call main like SAS-C */
return( main( 0L, (STRPTR *)wbstartup ) );
}
#endif /* _DCC */
/* main program entry */
long main( long ac, STRPTR *av )
{
LONG numArgs,
x;
struct WBStartup *wbstartup;
struct WBArg *wbarg;
struct DiskObject *tooldobj,
*projectdobj;
BPTR oldToolLock = NULL,
oldProjectLock = NULL;
main_retval = RETURN_OK;
main_retval2 = 0L;
if( CreateBasicResources() )
{
DefaultSettings();
/* check if something goes wrong (ENV error etc.) */
if( main_retval == RETURN_OK )
{
/* Workbench */
if( ac == 0L )
{
wbstartup = (struct WBStartup *)av;
numArgs = wbstartup -> sm_NumArgs;
wbarg = wbstartup -> sm_ArgList;
if( *(wbarg[ 0 ] . wa_Name) )
{
if( wbarg[ 0 ] . wa_Lock )
{
oldToolLock = CurrentDir( (wbarg[ 0 ] . wa_Lock) );
}
if( tooldobj = GetToolDiskObject( (wbarg[ 0 ] . wa_Name) ) )
{
/* two possible cases when started from workbench ... */
if( numArgs < 2L )
{
/* ... first case, only our tool icon is given, create one project here */
ScanToolTypes( (STRPTR *)(tooldobj -> do_ToolTypes) );
/* check if something goes wrong (parsing error, etc.) */
if( main_retval == RETURN_OK )
{
RunTool();
}
FreeInitProjectResult();
}
else
{
/* ... second case, a couple of project icons are given, multiple projects will start from here */
for( x = 1L ; x < numArgs ; x++ )
{
if( wbarg[ x ] . wa_Lock )
{
oldProjectLock = CurrentDir( (wbarg[ x ] . wa_Lock) );
}
if( *(wbarg[ x ] . wa_Name) )
{
if( projectdobj = GetDiskObject( (wbarg[ x ] . wa_Name) ) )
{
ScanToolTypes( (STRPTR *)(tooldobj -> do_ToolTypes) );
ScanToolTypes( (STRPTR *)(projectdobj -> do_ToolTypes) );
/* check if something goes wrong (parsing error, etc.) */
if( main_retval == RETURN_OK )
{
RunTool();
}
FreeInitProjectResult();
DefaultSettings();
FreeDiskObject( projectdobj );
}
}
if( wbarg[ x ] . wa_Lock )
{
CurrentDir( oldProjectLock );
}
}
}
FreeDiskObject( tooldobj );
}
if( wbarg[ 0 ] . wa_Lock )
{
CurrentDir( oldToolLock );
}
}
}
else
{
/* CLI/Shell */
if( startuprda = ReadArgs( STARTUP_TEMPLATE, (LONG *)(&result), NULL ) )
{
/* did we get a CTRL_C signal ? */
if( !CheckSignal( SIGBREAKF_CTRL_C ) )
{
ScanRDA();
/* check if something goes wrong (parsing error, etc.) */
if( main_retval == RETURN_OK )
{
RunTool();
}
FreeInitProjectResult();
}
else
{
/* SIGBREAKF_CTRL_C found */
main_retval = RETURN_WARN;
main_retval2 = ERROR_BREAK;
}
FreeArgs( startuprda );
}
else
{
/* ReadArgs failed */
main_retval = RETURN_FAIL;
main_retval2 = IoErr();
}
}
}
DeleteBasicResources();
}
PrintFault( main_retval2, NAME );
SetIoErr( main_retval2 );
return( main_retval );
}
static
void DefaultSettings( void )
{
struct Process *ThisProcess = (struct Process *)FindTask( NULL );
ClearRDA();
memset( (void *)(&project), 0, sizeof( project ) );
/* Default values */
project . rebootdelay = 2UL;
/* In the case that (ThisProcess -> pr_WindowPtr) is -1L the OS aborts requesters automatically.
* If we were launched from shell, we fore the NOGUI option that the user can be promped.
*/
if( (ThisProcess -> pr_CLI) && ((ThisProcess -> pr_WindowPtr) == (APTR)-1L) )
{
project . nogui = TRUE;
}
/* read prefs */
ReadENVPrefs();
}
static
void ReadENVPrefs( void )
{
struct RDArgs envvarrda =
{
NULL,
256L,
0L,
0L,
NULL,
0L,
NULL,
RDAF_NOPROMPT
};
TEXT varbuff[ 258 ];
envvarrda . RDA_Source . CS_Buffer = varbuff;
if( GetVar( NAME, varbuff, 256L, 0UL ) != (-1L) )
{
strcat( varbuff, "\n" );
if( ReadArgs( ENV_TEMPLATE, (LONG *)(&result), (&envvarrda) ) )
{
ScanRDA();
FreeArgs( (&envvarrda) );
}
else
{
/* Can't parse ENV variable */
main_retval = RETURN_FAIL;
main_retval2 = IoErr();
}
}
}
static
void ClearRDA( void )
{
memset( (void *)(&result), 0, sizeof( result ) );
}
static
void ScanRDA( void )
{
if( result . rebootdelay )
{
project . rebootdelay = (ULONG)(*(result . rebootdelay));
}
if( result . noreq )
{
project . noreq = TRUE;
}
if( result . off )
{
project . off = TRUE;
}
if( result . nogui )
{
project . nogui = TRUE;
}
ClearRDA();
}
static
void ScanToolTypes( STRPTR *tt )
{
STRPTR s;
if( s = FindToolType( tt, "REBOOTDELAY" ) )
(void)StrToLong( s, (LONG *)(&(project . rebootdelay)) ); /* note: result ignored */
if( s = FindToolType( tt, "NOREQ" ) )
result . noreq = (long *)s;
if( s = FindToolType( tt, "QUIET" ) )
result . noreq = (long *)s;
if( s = FindToolType( tt, "OFF" ) )
result . off = (long *)s;
if( s = FindToolType( tt, "NOGUI" ) )
result . nogui = (long *)s;
ScanRDA();
}
static
void FreeInitProjectResult( void )
{
/* NOP */
}
static
BOOL CreateBasicResources( void )
{
return( OpenLibStuff() );
}
static
void DeleteBasicResources( void )
{
CloseLibStuff();
}
static
BOOL OpenLibStuff( void )
{
UtilityBase = IconBase = LocaleBase = NULL;
if( IntuitionBase = OpenLibrary( "intuition.library", 37UL ) )
{
AttemptOpenLibrary( (&UtilityBase), NAME, UTILITYNAME, 37UL );
AttemptOpenLibrary( (&IconBase), NAME, ICONNAME, 37UL );
AttemptOpenLibrary( (&LocaleBase), NAME, "locale.library", 38UL );
if( LocaleBase )
{
loc = OpenLocale( NULL );
ct = OpenCatalogA( NULL, (NAME ".catalog"), NULL );
}
if( UtilityBase && IconBase )
{
return( TRUE );
}
}
CloseLibStuff();
/* Can't open requires libraries */
main_retval = RETURN_FAIL;
main_retval2 = ERROR_INVALID_RESIDENT_LIBRARY;
return( FALSE );
}
static
void CloseLibStuff( void )
{
if( LocaleBase )
{
CloseCatalog( ct );
CloseLocale( loc );
CloseLibrary( LocaleBase );
}
CloseLibrary( IconBase );
CloseLibrary( UtilityBase );
CloseLibrary( IntuitionBase );
}
void AttemptOpenLibrary( struct Library **library, STRPTR title, STRPTR libname, ULONG libversion )
{
struct EasyStruct LibNotFoundES,
LibWrongVersionES;
LibNotFoundES . es_StructSize = sizeof( struct EasyStruct );
LibNotFoundES . es_Flags = 0UL;
LibNotFoundES . es_Title = title;
LibNotFoundES . es_TextFormat = SafeGetCatalogStr( ct, MSG_LIB_NOT_FOUND_REQTEXT, MSG_LIB_NOT_FOUND_REQTEXT_STR );
LibNotFoundES . es_GadgetFormat = SafeGetCatalogStr( ct, MSG_LIB_NOT_FOUND_REQGAD, MSG_LIB_NOT_FOUND_REQGAD_STR );
LibWrongVersionES . es_StructSize = sizeof( struct EasyStruct );
LibWrongVersionES . es_Flags = 0UL;
LibWrongVersionES . es_Title = title;
LibWrongVersionES . es_TextFormat = SafeGetCatalogStr( ct, MSG_LIB_WRONG_VERSION_REQTEXT, MSG_LIB_WRONG_VERSION_REQTEXT_STR );
LibWrongVersionES . es_GadgetFormat = SafeGetCatalogStr( ct, MSG_LIB_WRONG_VERSION_REQGAD, MSG_LIB_WRONG_VERSION_REQGAD_STR );
if( (*library) == NULL )
{
for( ;; )
{
/* attemp to open shared library */
(*library) = OpenLibrary( libname, 0UL );
if( *library )
{
if( ((*library) -> lib_Version) < libversion )
{
EasyRequest( NULL, (&LibWrongVersionES), NULL, libname, libversion );
CloseLibrary( (*library) );
(*library) = NULL;
}
break;
}
/* prompt the user */
if( EasyRequest( NULL, (&LibNotFoundES), NULL, libname ) == 0L )
{
/* user canceled */
break;
}
}
}
}
static
void RunTool( void )
{
if( project . noreq )
{
MyReboot();
}
else
{
if( project . nogui )
{
TEXT buffer[ 8 ] = { 0 };
STRPTR yes = SafeGetLocaleStr( loc, YESSTR, "Yes" ),
no = SafeGetLocaleStr( loc, NOSTR, "No" );
Printf( "%s (%lc/%lc)\n", SafeGetCatalogStr( ct, MSG_REBOOT_REQTEXT, MSG_REBOOT_REQTEXT_STR ),
(ULONG)(*yes),
(ULONG)(*no) );
Flush( Input() ); /* Remove outstanding rubbish */
Flush( Output() ); /* Be sure that the user got the message */
FGets( Input(), buffer, (sizeof( buffer ) - 1UL) );
/* Simple RETURN for yes or 'Y' (english) for ok) */
if( (*buffer == '\n') || (ToUpper( (ULONG)(*buffer) ) == ToUpper( (ULONG)(*yes) ) ) )
{
/* user wants to reboot */
MyReboot();
}
else
{
/* cancelled */
main_retval2 = ERROR_BREAK;
main_retval = RETURN_WARN;
}
}
else
{
struct EasyStruct RebootES;
RebootES . es_StructSize = sizeof( struct EasyStruct );
RebootES . es_Flags = 0UL;
RebootES . es_Title = NAME;
RebootES . es_TextFormat = SafeGetCatalogStr( ct, MSG_REBOOT_REQTEXT, MSG_REBOOT_REQTEXT_STR );
RebootES . es_GadgetFormat = SafeGetCatalogStr( ct, MSG_REBOOT_REQGAD, MSG_REBOOT_REQGAD_STR );
if( EasyRequestArgs( NULL, (&RebootES), NULL, NULL ) == 1L )
{
/* user wants to reboot */
MyReboot();
}
else
{
/* cancelled */
main_retval2 = ERROR_BREAK;
main_retval = RETURN_WARN;
}
}
}
}
static
void MyReboot( void )
{
struct Window *abortreqwindow = NULL;
ULONG delay,
x;
BOOL abort = FALSE;
ULONG abortreqsignal,
sigmask,
signals;
/* 1 second is the minimum reboot delay... */
if( (project . rebootdelay) < 1UL )
{
project . rebootdelay = 1UL;
}
/* Prompt user ? */
if( !(project . noreq) )
{
if( project . nogui )
{
Printf( "%s\n", SafeGetCatalogStr( ct, MSG_ABORTREBOOT_REQTEXT, MSG_ABORTREBOOT_REQTEXT_STR ) );
Flush( Input() ); /* Remove outstanding rubbish */
Flush( Output() ); /* Be sure that the user got the message */
}
else
{
struct EasyStruct AbortRebootES;
AbortRebootES . es_StructSize = sizeof( struct EasyStruct );
AbortRebootES . es_Flags = 0UL;
AbortRebootES . es_Title = NAME;
AbortRebootES . es_TextFormat = SafeGetCatalogStr( ct, MSG_ABORTREBOOT_REQTEXT, MSG_ABORTREBOOT_REQTEXT_STR );
AbortRebootES . es_GadgetFormat = SafeGetCatalogStr( ct, MSG_ABORTREBOOT_REQGAD, MSG_ABORTREBOOT_REQGAD_STR );
/* Here we must check if we got the "low mem" return value (see BuildEasyRequestArgs autodoc)
* which may be 0 or 1
* For 0, I cannot determinate if this is a result from alert or a 'real' low mem failure
*/
abortreqwindow = BuildEasyRequestArgs( NULL, (&AbortRebootES), 0UL, NULL );
if( (abortreqwindow == ((struct Window *)1UL)) || (abortreqwindow == NULL) )
{
/* Can't open abort requester */
main_retval2 = ERROR_NO_FREE_STORE;
main_retval = RETURN_FAIL;
return;
}
}
}
abortreqsignal = ((abortreqwindow)?(1UL << abortreqwindow -> UserPort -> mp_SigBit):(0UL));
sigmask = SIGBREAKF_CTRL_C | abortreqsignal;
#define CHECKS_PER_SEC (2UL)
delay = (project . rebootdelay) * CHECKS_PER_SEC;
/* for each cycle we'll check if any abort signal arrived (CTRL_C or requester) */
for( x = 0UL ; x <= delay ; x++ )
{
/* check if user aborts countdown */
signals = CheckSignal( sigmask );
if( signals & SIGBREAKF_CTRL_C )
{
abort = TRUE;
}
if( project . nogui )
{
/* Did user hit key for abort ? */
if( WaitForChar( Input(), 10L ) )
{
abort = TRUE;
}
}
else
{
/* no window, no signal, no event processing ... */
if( abortreqsignal )
{
if( signals & abortreqsignal )
{
if( SysReqHandler( abortreqwindow, NULL, FALSE ) == 0L )
{
abort = TRUE;
}
}
}
}
if( abort )
{
break;
}
/* wait a little bit */
Delay( (TICKS_PER_SECOND / CHECKS_PER_SEC) );
}
/* No abort ? */
if( abort == FALSE )
{
if( abortreqwindow )
{
/* if we got no abort msg, check the requester for any outstanding msg */
if( SysReqHandler( abortreqwindow, NULL, FALSE ) == 0L )
{
abort = TRUE;
}
}
}
/* Check if user send us CTRL-C or has selected test mode using something like "Setenv Reboot OFF" */
if( abort || (project . off) )
{
/* Aborted by requester or user-setup */
main_retval2 = ERROR_BREAK;
main_retval = RETURN_WARN;
}
else
{
/* bite in the dust */
ColdReboot();
}
/* user has aborted the rebooting sequence */
FreeSysRequest( abortreqwindow );
}
static
STRPTR SafeGetCatalogStr( struct Catalog *ct, LONG id, STRPTR s )
{
if( LocaleBase )
{
s = GetCatalogStr( ct, id, s );
}
return( s );
}
static
STRPTR SafeGetLocaleStr( struct Locale *loc, LONG id, STRPTR s )
{
if( LocaleBase && loc )
{
s = GetLocaleStr( loc, id );
}
return( s );
}
static
struct DiskObject *GetToolDiskObject( STRPTR name )
{
struct DiskObject *dobj;
struct Process *ThisProc = (struct Process *)FindTask( NULL );
BPTR olddir = CurrentDir( (ThisProc -> pr_HomeDir) );
dobj = GetDiskObjectNew( name );
(void)CurrentDir( olddir );
return( dobj );
}